<?php
namespace Zxf5115\Laravel\Kernel\Builders;

use Exception;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Relation;

/**
 * @author zhangxiaofei [<1326336909@qq.com>]
 * @dateTime 2025-09-21
 *
 * 关联关系处理器类
 */
class WithBuilder
{
  /**
   * 当前操作模型对象
   */
  protected $query;

  /**
   * 初始化请求处理器类
   *
   * @param Builder $query 当前操作模型对象
   */
  public function __construct(Builder $query)
  {
    $this->query = $query;
  }


  /**
   * 获取当前服务实例
   *
   * @param Builder $query 当前操作模型对象
   * @return self
   */
  public static function myself(Builder $query) : self
  {
    // 使用基础服务类
    return new self($query);
  }


  /**
   * 处理请求查询逻辑中关联对象
   *
   * @param array $with 关联对象
   * @param string $relationName 关联对象名称
   */
  public function buildWith(mixed $with, string $relationName) : void
  {
    // 将值标准化为数组
    $withArray = self::normalizeToArray($with);

    if(!empty($withArray))
    {
      if(array_key_exists($relationName, $withArray))
      {
        // 将值标准化为数组
        $this->query->with(self::normalizeToArray($withArray[$relationName]));
      }

      if(array_key_exists(0, $withArray) && !is_array($withArray[0]))
      {
        $this->query->with($withArray);
      }
    }
  }


  /**
   * 将值标准化为数组
   *
   * @param mixed $value 需要标准化的值
   * @return array 标准化后的数组
   */
  private static function normalizeToArray(mixed $value): array
  {
    return is_array($value) ? $value : (empty($value) ? [] : [$value]);
  }
}
